package Principal;

//import javax.print.attribute.standard.MediaTray;
import javax.swing.JOptionPane;

//import org.omg.PortableInterceptor.INACTIVE;

//import java.util.List;

//import java.awt.peer.MenuPeer;
import java.util.LinkedList;

public class App {
	
	public static void main (String[] args) {
		
		App app = new App ();
		app.menuPrincipal();
		
	}
	
	//Atributos
	Usuario usuario;
	LinkedList <Instituicao> instituicoes;
	LinkedList <Aluno> alunos;
	LinkedList <Curso> cursos;
	LinkedList <Disciplina> disciplinas;
	LinkedList <Endereco> enderecos;
	LinkedList <Evento> eventos;
			
	public App () {
		
		usuario = new Usuario();		
		instituicoes = new LinkedList <Instituicao> ();
		alunos = new LinkedList <Aluno> ();
		cursos = new LinkedList <Curso> ();
		disciplinas = new LinkedList <Disciplina> ();
		enderecos = new LinkedList <Endereco> ();
		eventos = new LinkedList <Evento> ();
		
	}
	
	/*-------------------------------Menu do Usuario-------------------------------------*/
	
boolean sair = true;// Utilisado pelo metodo -> sair. Valor que quando alterado permite sair do programa.	
boolean parar = true; // Utilisado pelos metodos de cadastro. Serve para para o loop de cadastro.   
String tipo; // Determina o tipo de evento do metodo -> cadastrarEvento.

	/*-------------------------------Menu Principal-------------------------------------*/
	
	public void menuPrincipal () {
		
		while (sair) {
			
			int opc = Integer.parseInt(JOptionPane.showInputDialog("Seja bem vido ao JOB TOO FEEDBACK \n\n" + 
																	"Digite:" + "\n\n" + 
																	"1- Adicionar nova instituição." + "\n" +
																	"2- Acessar instituição já existente." + "\n" +
																	"3- Sair" + "\n\n"));//aplicar exeção			
			
			switch (opc) {		
			
			case 1:
				parar = true;
				
				while (parar){
					
					addInstituicaoUsuario ();						
					
				}
				
				break;			
				
			case 2:
				selecionarInstituicao ();				
				break;			
				
			case 3:
				sair();
				break;		
				
			default :
				JOptionPane.showMessageDialog(null, "Opção invalida!");
				
			}
			
		}
				
	}
	
	/*-------------------------------Menu Instituicao-------------------------------------*/
	
	public void menuInstituicao (Instituicao inst) {
						
		while (sair){
			
			int opc = Integer.parseInt(JOptionPane.showInputDialog("" + inst.getNome() + "\n\n" +
														"O que você deseja fazer?" + "\n\n" +													
														"1- Visualisação de Eventos?" + "\n" + // É bom deixar este campo apenas p visualizar os eventos e colocar a parte de criar eventos na opção cadastrar 
														"2- Cadastrar?" + "\n" + // Cadastrar Alunos ou Disciplinas
														"3- Remover?" + "\n" +
														"4- Disciplina?" + "\n" + // Onde tera opções referentes a sala de aula 
														"5- Pesquisa?" + "\n" + // Buscar alunos ou eventos. Seria uma busca q engloba toda a instituição
														"6- Voltar?" + "\n" +
														"7- Sair?" + "\n\n"));
			switch (opc) {
			
			case 1:
				visualisacaoEventos(inst);				
				break;
				
			case 2:
				menuCadastrar(inst);				
				break;
				
			case 3:
				
				if (inst.tamanhoLista() == 0) { // tamanhoLista se refere ao tamanho da lista disciplina
					
					JOptionPane.showMessageDialog(null, "Não existe nada cadastrado!");
					JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");			
					menuCadastrar(inst);
					
				}else {
					
					menuRemover(inst);
					
				}
										
				break;
				
			case 4:
				menuDisciplina(inst);						
				break;
				
			case 5:
				
				if (inst.listarAlunos().length() == 0) { //tamanhoLista() = se refere ao tamanho da disciplina
										
					JOptionPane.showMessageDialog(null,"Não existe aluno cadastrada!");
					JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");
					menuCadastrar(inst);
					
				}else {
							
				String nome = JOptionPane.showInputDialog("Que aluno vc pretende pesquisar?");				
				JOptionPane.showMessageDialog(null, inst.buscarAluno(nome));												
				break;
				
			}
				
			case 6:
				menuPrincipal();
				break;
				
			case 7:
				sair();				
				break;
				
			default:
				JOptionPane.showMessageDialog(null, "Opção invalida!");
				
			}
			
		}
		
	}
	
	/*-------------------------------Menu Cadastrar-------------------------------------*/
	
	public void menuCadastrar (Instituicao inst) {

		while (sair){
			
			int opc = Integer.parseInt(JOptionPane.showInputDialog("" + inst.getNome() + " -> " + "Cadastrar" + "\n\n" +
														"0- Cadastrar disciplina?" + "\n" +
														"1- Cadastrar aluno?" + "\n" +
														"2- Cadastrar evento" + "\n" +
														"3- Voltar?" + "\n" +
														"4- Sair?" + "\n\n"));
			switch (opc) {
			
			case 0:
				parar = true;
				while (parar){
					
					addDisciplina(inst);
										
				}
				
				break;
				
			case 1:
				parar = true;
				
				while (parar){
										
					addAluno(inst);
										
				}
				
				break;
				
			case 2:				
				selecionarEventosDisciplina (inst);
				break;
				
			case 3:
				menuInstituicao (inst);
				break;
				
			case 4:
				sair();
				break;
				
			default :
				JOptionPane.showMessageDialog(null, "Opção invalida!");	
				
		}
			
	}
		
}
	
	/*-------------------------------Menu remover-------------------------------------*/
	
	public void menuRemover (Instituicao inst) {
		
		while (sair){
			
			int opc = Integer.parseInt(JOptionPane.showInputDialog("" + inst.getNome() + " -> " + "Remover" + "\n\n" +
														"0- Remover disciplina?" + "\n" +
														"1- Remover aluno?" + "\n" +
														"2- Remover evento?" + "\n" +
														"3- Voltar?" + "\n" +
														"4- Sair?" + "\n\n"));
			switch (opc) {
			
			case 0:
				
				if (inst.tamanhoLista() == 0) {
									
					JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");								
					menuRemover(inst);
					
				}else {
				
				int opc1 = Integer.parseInt(JOptionPane.showInputDialog("Escolha a disciplina a ser removida:\n\n"
																		+inst.listarDisciplinas()));
				Disciplina disc = inst.selecionarDisciplinas(opc1);				
				inst.remover(disc);
				
				break;
				
				}
				
			case 1:
				
				if (inst.tamanhoLista() == 0) {
					
					JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");								
					menuRemover(inst);
					
				}else {					
				
				int opc2 = Integer.parseInt(JOptionPane.showInputDialog("Escolha o aluno para ser removido:\n\n"
																		+inst.listarAlunos()));
				Aluno alun = inst.selecionarAluno(opc2);				
				inst.removerAluno(alun);				
				break;
				
				}
				
			case 2:
				
				if (inst.tamanhoLista() == 0) {
					
					JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");								
					menuRemover(inst);
					
				}else {
				
				int opc2 = Integer.parseInt(JOptionPane.showInputDialog("Escolha a disciplina a ser removida:\n\n"
																		+inst.listarEventos()));
				Evento even = inst.selecionarEvento(opc2);				
				inst.remover(even);				
				break;
				
				}
								
			case 3:
				menuInstituicao (inst);
				break;
				
			case 4:
				sair();
				break;
				
			default :
				JOptionPane.showMessageDialog(null, "Opção invalida!");	
				
		}
			
	}
		
}

	/*-------------------------------adicionar endereço-------------------------------------*/
	
	public void addEndereco () {
		
		Endereco endereco = new Endereco();
		String estado = JOptionPane.showInputDialog("Qual o nome do estado?");
		String cidade = JOptionPane.showInputDialog("Qual o nome da cidade?");
		String bairro = JOptionPane.showInputDialog("Qual o nome do bairro?");
		String rua = JOptionPane.showInputDialog("Qual o nome da rua?");
		int numero = Integer.parseInt(JOptionPane.showInputDialog("Qual o número?"));
		String comentario = JOptionPane.showInputDialog("Comente se nescessário");		
		endereco.setEstado(estado);
		endereco.setCidade(cidade);
		endereco.setBairro(bairro);
		endereco.setRua(rua);
		endereco.setNumero(numero);
		endereco.setComentario(comentario);		
		enderecos.add(endereco);
		
	}
	
	/*-------------------------------adicionar instituição-------------------------------------*/
	
	public void addInstituicaoUsuario () {
		
		Instituicao inst = new Instituicao();		
		String instituicao = JOptionPane.showInputDialog("Em que instituição você ensina? \n"+
															"(Para encerrar digite 0)");
		instituicao  = instituicao.toUpperCase();
		
		if (instituicao.equals("0")){
		
				JOptionPane.showMessageDialog(null, "Cadastro realizado com sucesso!");
				parar = false;
				menuPrincipal();
			
			}
			
		if (!instituicao.equals("0")) {
			
			if (!instituicao.equals("")){
				
				inst.setNome(instituicao);
				instituicoes.add(inst);
				usuario.addInstituicao(inst);
				
			}			
							
		}				
				
	}
	
	/*-------------------------------adicionar aluno-------------------------------------*/
	
	public void addAluno (Instituicao inst) {
		
		Aluno aluno = new Aluno();		
				
		if (inst.tamanhoLista() == 0 ) {
			
			JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");			
			menuCadastrar(inst);
			
		}else if (inst.tamanhoLista() != 0 ){	
			
			String nomeAluno = JOptionPane.showInputDialog("Qual o nome do aluno? ");

			parar = true;
			
			while (parar){

				String selecionarDisciplinaString = JOptionPane.showInputDialog("Matricular em q disciplina? \n" 
						+ "Para sair digite (s). \n\n" +inst.listarDisciplinas());
				
				if (selecionarDisciplinaString.equalsIgnoreCase("s") || selecionarDisciplinaString.equalsIgnoreCase("S")){
					
					menuCadastrar(inst);//votar para o menu cadastrar
					parar = false;					
					
				}else {
					
					int selecionarDisciplinaInt = Integer.parseInt(selecionarDisciplinaString);
					Disciplina disc = inst.selecionarDisciplinas(selecionarDisciplinaInt);
					aluno.addDisciplina(disc);
					disciplinas.add(disc);					
					aluno.setNome(nomeAluno);					
					inst.addAluno(aluno);					
					instituicoes.add(inst);					

				}
				
			}													
						
			menuCadastrar(inst);//votar para o menu cadastrar			
			
		}
		
	}
	
	/*-------------------------------adicionar disciplina-------------------------------------*/
	
	public void addDisciplina (Instituicao inst) {

		Disciplina disc = new Disciplina();
				
		String nomeDisciplina = JOptionPane.showInputDialog("Qual o nome da disciplina? \n"+
															"(Para encerrar digite 0)");
						
		if (nomeDisciplina.equals("0")){
						
			parar = false;
			menuCadastrar(inst);
			
		}else {			
			
			disc.setNome(nomeDisciplina);			
			inst.addDisciplina(disc);			
			disciplinas.add(disc);
			instituicoes.add(inst);						
			JOptionPane.showMessageDialog(null," Cadastro realizado com sucesso!");
					
			}
		
		}
	
	/*-------------------------------opçoes da instituição-------------------------------------*/
	
//	public void opcInstituicao() {
//		
//		JOptionPane.showMessageDialog(null, instituicoes);
//		
//	}	
	
	/*-------------------------------selecionar instituição-------------------------------------*/
	
	public void selecionarInstituicao () {
		
		if (instituicoes.size() > 0){
						
			int opc = Integer.parseInt(JOptionPane.showInputDialog(usuario.listarInstituicaes()));
			
			if (opc >= usuario.contadorInstituicaes()){
				
				JOptionPane.showMessageDialog(null,"É necessario digiter uma valor referente a uma instituição.");
				selecionarInstituicao();
				
			}else {
			
				Instituicao inst = instituicoes.get(opc);			
				menuInstituicao(inst); //passando como parametro a instituição selecionada
			
			}
			
		}else {
			
			JOptionPane.showMessageDialog(null, "É nescessario cadastrar uma instituição.");
			
		}
		
	}	
		
	/*-------------------------------selecionar eventos-------------------------------------*/
	
	public void selecionarEventos (Instituicao inst) {
				
		if (inst.tamanhoLista() == 0) { // tamanhoLista se refere ao tamanho da lista disciplina
				
			JOptionPane.showMessageDialog(null, "É necessário cadastra pelomenos uma disciplina.");
			JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");			
			menuCadastrar(inst);
			
		}else {
				
		while (sair) {
			
			if (inst.tamanhoLista() == 0) {
				
				JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");
				JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");			
				menuCadastrar(inst);
				
			}else {
			
			String selecionarDisciplinaString = JOptionPane.showInputDialog("Que disciplina você deseja usar? \n\n");			
			int selecionarDisciplinaInt = Integer.parseInt(selecionarDisciplinaString);
			Disciplina disc = inst.selecionarDisciplinas(selecionarDisciplinaInt);			
			int tipoEvento = Integer.parseInt(JOptionPane.showInputDialog(inst.getNome() + " -> " + "Tipo de evento"  
					+ disc.getNome() + "\n\n" +					
					"Qual o tipo de evento?\n\n" +
					"0- Prova. \n" +
					"1- Trabalho. \n" +
			
					"2- Reunião. \n" +
					"3- Congresso. \n" +
					"4- Votar. \n " +
					"5- Sair. \n\n"));
			
			switch (tipoEvento) {

			case 0:
				cadastrarEvento(tipoEvento, inst, disc);			
				break;

			case 1:
				cadastrarEvento(tipoEvento, inst, disc);
				break;

			case 2:
				cadastrarEvento(tipoEvento, inst, disc);
				break;

			case 3:
				cadastrarEvento(tipoEvento, inst, disc);
				break;

			case 4:
				menuInstituicao (inst);
				break;

			case 5:
				sair();			
				break;		

			default :
				JOptionPane.showMessageDialog(null, "Opção invalida!");	
				
					}
			
				}
			
			}
		
		}
		
	}
	
	/*-------------------------------selecionar eventos disciplina-------------------------------------*/
	
	public void selecionarEventosDisciplina (Instituicao inst) {
		
		if (inst.tamanhoLista() == 0) {
			
			JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");
						
		}else {
		
		String selecionarDisciplinaString = JOptionPane.showInputDialog("Que disciplina você deseja usar? \n\n" +inst.listarDisciplinas());		
		int selecionarDisciplinaInt = Integer.parseInt(selecionarDisciplinaString);
		Disciplina disc = inst.selecionarDisciplinas(selecionarDisciplinaInt);			
				
		while (sair) {
				
		if (inst.tamanhoLista() == 0) {
			
			JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");
			JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");			
			menuCadastrar(inst);
			
		}else {
								
		int tipoEvento = Integer.parseInt(JOptionPane.showInputDialog("" + inst.getNome() + " -> " + "Eventos de"  + " -> " 
														+ disc.getNome() + "." + "\n\n" +
														"Qual o tipo de evento?\n\n" +
														"0- Prova. \n" +
														"1- Trabalho. \n" +
														"2- Votar" + "\n" +
														"3- Sair" + "\n"));
		
		switch (tipoEvento) {
		
		case 0:
			cadastrarEvento(tipoEvento, inst, disc);
			break;
			
		case 1:
			cadastrarEvento(tipoEvento, inst, disc);
			break;
			
		case 2:
			menuCadastrar(inst);
			break;
		
		case 3:
			sair();			
			break;	
		
		default :
			JOptionPane.showMessageDialog(null, "Opção invalida!");	
			
					}
		
				}
		
			}
		
		}
		
	}
	
	/*------------------------------menu disciplina-------------------------------*/
	
	public void menuDisciplina (Instituicao inst) {
		
		if (inst.tamanhoLista() == 0) {
			
			JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");
			JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");
			menuCadastrar(inst);
			
		}else {
		
		String selecionarDisciplinaString = JOptionPane.showInputDialog("Que disciplina você deseja usar? \n\n" +inst.listarDisciplinas());
		
		int selecionarDisciplinaInt = Integer.parseInt(selecionarDisciplinaString);
		Disciplina disc = inst.selecionarDisciplinas(selecionarDisciplinaInt);			
				
		while (sair) {
				
		if (inst.tamanhoLista() == 0) {
			
			JOptionPane.showMessageDialog(null,"Não existe disciplina cadastrada!");
			JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");			
			menuCadastrar(inst);
			
		}else {
								
		int tipoEvento = Integer.parseInt(JOptionPane.showInputDialog("" + inst.getNome() + " -> " + "Disciplina"  + " -> " 
														+ disc.getNome() + "." + "\n\n" +
														"Qual o tipo de evento?\n\n" +
														"0- Prova. \n" +
														"1- Trabalho. \n" +
														"2- Freguencia." + "\n" +
														"3- Votar" + "\n" +
														"4- Sair" + "\n"));
		
		switch (tipoEvento) {
		
		case 0:
			cadastrarEvento(tipoEvento, inst, disc);
			break;
			
		case 1:
			cadastrarEvento(tipoEvento, inst, disc);
			break;
			
		case 2:
			JOptionPane.showMessageDialog(null, disc.listarAlunos());			
			break;
			
		case 3:
			menuInstituicao(inst);
			break;
		
		case 4:
			sair();			
			break;	
		
		default :
			JOptionPane.showMessageDialog(null, "Opção invalida!");	
			
					}
		
				}
		
			}
		
		}
		
	}			

	/*-------------------------------cadastrar eventos-------------------------------------*/
	
	public void cadastrarEvento (int tipoEvento, Instituicao inst, Disciplina disc) {
						
		Evento evento = new Evento();		
		
		/*quando for prova ou trabalho*/
		
		if (tipoEvento == 0){
			
			tipo = "Prova";
			
		}else if (tipoEvento == 1) {
			
			tipo = "Trabalho";
			
		}else if (tipoEvento == 2) {
			
			tipo = "reunião";
			
		}else if (tipoEvento == 3) {
			
			tipo =	"Cogresso";
			
		}
			
			evento.setTipo(tipo);
			String data = JOptionPane.showInputDialog("Qual a data do evento?" + "\n" +
			"ex: (dia/mes/ano)");
			String hora = JOptionPane.showInputDialog("Qual a hora do evento?" + "\n" +
			"ex: (hora:minuto)");
			String comentario = JOptionPane.showInputDialog("Comente se nescessário:");
			evento.setData(data);
			evento.setHora(hora);
			evento.setComentario(comentario);				
			inst.addEvento(evento);
			disc.addEvento(evento);
			instituicoes.add(inst);
			disciplinas.add(disc);
			eventos.add(evento);
			
	}
		
	
	/*-------------------------------visualisaçao de eventos-------------------------------------*/
	
	public void visualisacaoEventos (Instituicao inst) {
			
		
		if (inst.listarEventos().equals("")){
			JOptionPane.showMessageDialog(null, "Não existe evento cadastrado.");
			JOptionPane.showMessageDialog(null,"Você será redirecionado para a tela de cadastros.");
			menuCadastrar(inst);
			
		}else {
			
			String selecionarDisciplinaString = JOptionPane.showInputDialog("Que disciplina você deseja usar? \n\n" +inst.listarDisciplinas());			
			int selecionarDisciplinaInt = Integer.parseInt(selecionarDisciplinaString);
			Disciplina disc = inst.selecionarDisciplinas(selecionarDisciplinaInt);
			String eventoLocal = disc.listarEventos();
			JOptionPane.showMessageDialog(null, eventoLocal); 
						
		}
		
	}
		
	
	/*-------------------------------sair do programa-------------------------------------*/
	
	public void sair () {
		
		sair = false;
		parar = false;
		
	}

} 

